package com.huahai.aop;

import cn.hutool.core.util.ObjUtil;
import com.huahai.common.BaseResponse;
import com.huahai.constant.RedisConstant;
import com.huahai.pojo.vo.picture.PictureVO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 图片浏览量 AOP
 *
 * @author huahai
 */
@Aspect
@Component
@Slf4j
public class PictureViewCountAspect {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 图片浏览量切点
     * 拦截 com.huahai.controller.PictureController.getPictureVOById() 方法
     */
    @Pointcut("execution(* com.huahai.controller.PictureController.getPictureVOById(..))")
    public void pictureViewCount() {
    }

    /**
     * 图片浏览量统计切片
     * @param joinPoint 切点
     * @param result 返回结果
     */
    @AfterReturning(returning = "result", pointcut = "pictureViewCount()")
    public void doAfterReturn(JoinPoint joinPoint, Object result){
        // 1. 转换返回结果
        BaseResponse<PictureVO> pictureVOBaseResponse = (BaseResponse<PictureVO>) result;
        if(pictureVOBaseResponse ==  null){
            log.error("图片浏览量 AOP 返回结果不存在");
            return;
        }
        // 2. 获取图片 id
        PictureVO pictureVO = pictureVOBaseResponse.getData();
        if(pictureVO == null){
            log.error("图片浏览量 AOP 获取图片信息不存在");
            return;
        }
        Long pictureId = pictureVO.getId();
        Long viewCount = pictureVO.getViewCount();
        if(ObjUtil.hasNull(pictureId, viewCount)){
            log.error("图片浏览量 AOP 获取图片 ID 或者浏览量不存在");
            return;
        }
        // 3. 统计图片的浏览量
        handleCountPictureView(pictureId, viewCount);
    }

    /**
     * 处理图片的浏览量
     * @param pictureId 图片 id
     * @param viewCount 图片浏览量
     */
    private void handleCountPictureView(Long pictureId, Long viewCount) {
        // 1. 获取存储图片的浏览量 key
        String viewKey = RedisConstant.PROJECT_NAME + RedisConstant.VIEW_COUNT + pictureId;
        // 2. 将图片的浏览量存储到 Redis 中
        // 2.1 如果不存在，直接重新添加浏览量
        stringRedisTemplate.opsForValue().setIfAbsent(viewKey, viewCount.toString());
        // 2.2 如果存在，则将浏览量累加
        stringRedisTemplate.opsForValue().increment(viewKey);
    }

}
